home *** CD-ROM | disk | FTP | other *** search
- ; FILE: Source:modules/MuMove4K.ASM REV: 1 --- MuMove4k BlizKick module
-
- ;
- ; MuMove4K BlizKick module implementation
- ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ;
- ; This module substitutes MuMove4K program by Thomas Richter.
- ; Based on reverse-engineered code of the original MuMove4K (Hi Thomas :-).
- ;
- ; BlizKick module adaption by Harry "Piru" Sintonen.
- ;
-
-
- incdir "include:"
- include "exec/ports.i" ; Some required...
- include "exec/memory.i"
- include "exec/resident.i"
- include "exec/execbase.i"
- include "blizkickmodule.i"
-
- _LVOForbid EQU -$84
- _LVOPermit EQU -$8A
- _LVOAllocMem EQU -$C6
- _LVOFreeMem EQU -$D2
- _LVORemove EQU -$FC
- _LVOEnqueue EQU -$10E
- _LVOAddPort EQU -$162
- _LVOTypeOfMem EQU -$216
-
-
- ; private data structure used by
- ; MuMove4K & MuFastZero.
-
- STRUCTURE mumovedata,0
- STRUCT mmd_pad0,$08 ; $00
- STRUCT mmd_romtag1,RT_SIZE ; $08
- STRUCT mmd_romtag2,RT_SIZE ; $22
- APTR mmd_rt1ptr ; $3C
- APTR mmd_rt2ptr ; $40
- APTR mmd_tagptr1 ; $44
- ULONG mmd_A1200 ; $48
- ULONG mmd_PREPAREEMUL ; $4C
- APTR mmd_tagptr2 ; $50 (NULL -> MuMove4k can't remove the romtag)
- STRUCT mmd_pad1,$0A ; $54
- UWORD mmd_version ; $5E
- APTR mmd_mmd_ptr ; $60
- ULONG mmd_allocsize ; $64
- STRUCT mmd_port,MP_SIZE ; $68 (this must be initialized)
- UWORD mmd_pad2 ; $8A
- APTR mmd_nextptr ; $8C
- APTR mmd_realmhptr ; $90
- ULONG mmd_maxsize ; $94
- APTR mmd_codestart ; $98
- LABEL mmd_SIZEOF ; $9C
-
-
- SECTION MODULE,CODE
- _DUMMY_LABEL
- BK_MOD 0,_end,(RTF_COLDSTART)<<24+37<<16+NT_UNKNOWN<<8+104,_name,_idstr,_init
-
- ; COLDSTART module, requires KS V37.x or better, module type NT_UNKNOWN, priority 104.
-
- _init movem.l d2/d3/a2-a4/a6,-(sp)
- move.l (4).w,a6
-
- move.l #mmd_SIZEOF,d0
- moveq #MEMF_PUBLIC,d1
- jsr (_LVOAllocMem,a6)
- tst.l d0
- beq .exit2
-
- move.l d0,a2
- clr.l (mmd_tagptr2,a2)
- move.w #1,(mmd_version,a2)
- move.l a2,(mmd_mmd_ptr,a2)
- clr.l (mmd_allocsize,a2)
-
- lea (_portname,pc),a0
- move.w #(NT_MSGPORT<<8)|$9C,(mmd_port+LN_TYPE,a2) ; pri = -100
- move.l a0,(mmd_port+LN_NAME,a2)
- move.w #(PA_IGNORE<<8),(mmd_port+MP_FLAGS,a2)
- clr.l (mmd_port+MP_SIGTASK,a2)
- lea (mmd_port+MP_MSGLIST,a2),a0
- NEWLIST a0
-
- ;lbC00052C movem.l d2/d3/a2-a4/a6,-(sp)
- ; move.w #$0333,(_custom+color)
- ; lea (stuff,pc),a1
- ; move.l (4).w,a6
- ; move.l (-4,a1),a2
- jsr (_LVOForbid,a6)
- clr.l (mmd_nextptr,a2)
- move.l #$00008000,d3
- move.l (LibList,a6),a3
- move.l d3,d2
- subq.l #1,d3
- bsr .processlist
- move.l (DeviceList,a6),a3
- bsr .processlist
- move.l d2,(mmd_maxsize,a2)
- move.l d2,d3
- .loop move.l d3,d0
- moveq #MEMF_CHIP,d1
- jsr (_LVOAllocMem,a6)
- tst.l d0
- move.l d0,a1
- beq.b .nomem
- lea (a1,d3.l),a0
- cmp.l d2,a0
- bhi.b .free
- move.l (mmd_nextptr,a2),(MC_NEXT,a1)
- move.l d3,(MC_BYTES,a1)
- move.l a1,(mmd_nextptr,a2)
- bra.b .loop
-
- .free move.l d3,d0
- jsr (_LVOFreeMem,a6)
- .nomem lsr.l #1,d3
- bne.b .loop
-
- moveq #MH_SIZE,d0
- moveq #MEMF_PUBLIC|MEMF_CHIP,d1
- jsr (_LVOAllocMem,a6)
- tst.l d0
- beq .exit
-
- move.l d0,a4
- move.l (MemList,a6),a3
- .find tst.l (a3)
- beq.b .exit
- cmp.l (MH_LOWER,a3),a4
- bhi.b .found
- move.l (a3),a3
- bra.b .find
-
- .found move.l a3,a1
- jsr (_LVORemove,a6)
-
- move.l a4,a1
- move.l a3,a0
- moveq #8-1,d0
- .copy move.l (a0)+,(a1)+
- dbra d0,.copy
-
- moveq #MH_SIZE,d2
- move.b #-127,(LN_PRI,a3)
- move.l (mmd_port+LN_NAME,a2),(LN_NAME,a3)
- move.w #MEMF_CHIP,(MH_ATTRIBUTES,a3)
- add.l a4,d2
- clr.l (MH_FIRST,a3)
- move.l a4,(MH_UPPER,a3)
- clr.l (MH_FREE,a3)
- move.l d2,(MH_LOWER,a4)
- move.l a3,(mmd_realmhptr,a2)
-
- lea (MemList,a6),a0
- move.l a3,a1
- jsr (_LVOEnqueue,a6)
-
- lea (MemList,a6),a0
- move.l a4,a1
- jsr (_LVOEnqueue,a6)
-
- .freeloop move.l (mmd_nextptr,a2),d0
- beq.b .done
- move.l d0,a1
- move.l (MC_NEXT,a1),(mmd_nextptr,a2)
- move.l (MC_BYTES,a1),d0
- jsr (_LVOFreeMem,a6)
- bra.b .freeloop
- .done
- lea (mmd_port,a2),a1
- jsr (_LVOAddPort,a6)
- ;
- ;.exit jsr (_LVOPermit,a6)
- ; movem.l (sp)+,d2/d3/a2-a4/a6
- ;.rts rts
-
- sub.l a2,a2
- .exit jsr (_LVOPermit,a6)
-
- move.l a2,d0
- beq.b .nofree
- move.l a2,a1
- move.l #mmd_SIZEOF,d0
- jsr (_LVOFreeMem,a6)
- .nofree
- .exit2 movem.l (sp)+,d2/d3/a2-a4/a6
- .rts rts
-
- .processlist tst.l (a3)
- beq.b .rts
- move.l a3,a1
- jsr (_LVOTypeOfMem,a6)
- btst #MEMB_CHIP,d0
- beq.b .pl_next
- move.l a3,d0
- clr.w d0
- moveq #0,d1
- tst.l d0
- bne.b .pl_next
- move.w (LIB_POSSIZE,a3),d1
- lea (a3,d1.l),a0
- cmp.l d2,a0
- bcs.b .pl_next
- move.l d3,d1
- move.l a0,d2
- not.l d1
- add.l d3,d2
- and.l d1,d2
- .pl_next move.l (a3),a3
- bra.b .processlist
-
-
- _portname
- _name dc.b '« MuMove4K »',0
- _idstr dc.b 'MuMove4K 40.18 (26.10.01)',0
- CNOP 0,2
- _end
-
- SECTION VERSION,DATA
-
- dc.b '$VER: MuMove4K_MODULE 40.18 (26.10.01)',0
-
-